package ThreadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName DaemonFromFactory
 * @Author LIBOFEI
 * @Date 2020/6/8 09:13
 * @Version 1.0
 **/
public class DaemonFromFactory implements Runnable {


    @Override
    public void run() {
        while (true){
            try {
                TimeUnit.MILLISECONDS.sleep(100);
                System.out.println(Thread.currentThread() + " " + this);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    /***
     * @Description
     * 这种行为是正确的, 即便你基于前面对 finally给出的承诺,并不希望出现这种行为,但情况
     * 仍将如此。当最后一个非后台线程终止时,后台线程会“突然”终止。因此一旦 maino退出,
     * JVM就会立即关闭所有的后台进程,而不会有任何你希望出现的确认形式。因为你不能以优雅
     * 的方式来关闭后台线程,所以它们几乎不是一种好的思想。非后台的 Executor通常是一种更好
     * 的方式,因为 Executor控制的所有任务可以同时被关闭。正如你将要在本章稍后看到的,在这
     * 种情况下,关闭将以有序的方式执行。
     * @Param [args]
     * @Author LIBOFEI
     * @Date 09:26 2020/6/8
     * @return void
     * @Version  1.0
    **/
    public static void main(String[] args) throws InterruptedException {
        ExecutorService service = Executors.newCachedThreadPool(new DaemonThreadFactory());
        for(int i = 0; i < 10 ;i++){
            service.execute(new DaemonFromFactory());
        }
        System.out.println("All daemons start");
        TimeUnit.MILLISECONDS.sleep(500);
    }
}
